"""LLM Plays Pokemon 模拟器基类模块"""

import os
import logging
from typing import Dict, Any, List, Optional

logger = logging.getLogger(__name__)


class EmulatorBase:
    """模拟器基类，定义所有模拟器实现必须遵循的接口"""
    
    def __init__(self, config: Dict[str, Any]):
        """初始化模拟器
        
        Args:
            config: 模拟器配置
        """
        self.config = config
        self.rom_path = config["rom_path"]
        self.save_state_dir = config["save_state_dir"]
        self.screenshot_dir = config["screenshot_dir"]
        self.running = False
        
        # 确保目录存在
        os.makedirs(self.save_state_dir, exist_ok=True)
        os.makedirs(self.screenshot_dir, exist_ok=True)
        
        logger.info(f"模拟器基类初始化完成")
    
    def start(self) -> bool:
        """启动模拟器
        
        Returns:
            是否成功启动
        """
        raise NotImplementedError("子类必须实现此方法")
    
    def stop(self) -> bool:
        """停止模拟器
        
        Returns:
            是否成功停止
        """
        raise NotImplementedError("子类必须实现此方法")
    
    def save_state(self, slot: int = 0) -> bool:
        """保存游戏状态
        
        Args:
            slot: 存档槽位
            
        Returns:
            是否成功保存
        """
        raise NotImplementedError("子类必须实现此方法")
    
    def load_state(self, slot: int = 0) -> bool:
        """加载游戏状态
        
        Args:
            slot: 存档槽位
            
        Returns:
            是否成功加载
        """
        raise NotImplementedError("子类必须实现此方法")
    
    def press_button(self, button: str, duration_ms: int = 100) -> bool:
        """按下按钮
        
        Args:
            button: 按钮名称
            duration_ms: 按下持续时间（毫秒）
            
        Returns:
            是否成功执行
        """
        raise NotImplementedError("子类必须实现此方法")
    
    def press_buttons(self, buttons: List[str], pause_ms: Optional[int] = None) -> bool:
        """按下一系列按钮
        
        Args:
            buttons: 按钮序列
            pause_ms: 每个按钮之间的暂停时间（毫秒）
            
        Returns:
            是否成功执行
        """
        raise NotImplementedError("子类必须实现此方法")
    
    def take_screenshot(self) -> Dict[str, Any]:
        """获取游戏截图
        
        Returns:
            包含截图路径的字典
        """
        raise NotImplementedError("子类必须实现此方法")
    
    def tick(self, count: int = 1) -> bool:
        """执行游戏帧更新
        
        Args:
            count: 更新的帧数
            
        Returns:
            是否成功执行
        """
        raise NotImplementedError("子类必须实现此方法")
    
    def execute(self, buttons: List[str], pause_ms: Optional[int] = None, tick_count: int = 5) -> Dict[str, Any]:
        """执行按钮序列并更新游戏画面
        
        Args:
            buttons: 按钮序列
            pause_ms: 每个按钮之间的暂停时间（毫秒）
            tick_count: 执行的帧数
            
        Returns:
            执行结果，包含截图
        """
        raise NotImplementedError("子类必须实现此方法")